/***************************************
 * \if English
 * @Date:2016.11.18
 * @Author:steven
 * @brief:
 * @Detail:
 * @Editor:
 * @Brief:
 * \else
 *
 * @创建日期：２０１６年１１月１８日
 * ＠作者：华磊
 * ＠大概功能描述：对ｘｍｌ文件属性节点的数据读写
 * ************************************/
#ifndef XMLPARSE_H
#define XMLPARSE_H

#include <QString>
#include <QtXml/QDomDocument>
#include <QtXml/QDomElement>
#include <QtXml/QDomNode>
#include <QtXml/QDomNodeList>
#include <QDebug>
#include <QVariant>
#include <QtXml/QDomProcessingInstruction>
#include <QMutex>


#include <QFile>

#include <vector>

#include "GeneralDefine.h"

//#include "md5check.h"

#ifndef D_COMPONENT_VERSION_FILE
//#define D_COMPONENT_VERSION_FILE "globalConfig/version/version.xml"
#endif

////语言类型
//enum LANGUAGE_TYPE
//{
//    ENUM_LAN_CHINESE,//中文
//    ENUM_LAN_ENGLISH,//英文
//    ENUM_LAN_END
//};

////消息级别
//enum MSG_LEVEL_TYPE
//{
//    ENUM_MSG_ERROR,//错误
//    ENUM_MSG_WARNING,//警告
//    ENUM_MSG_REMIND,//提示
//    ENUM_MSG_END
//};
////消息、日志类别
//enum MESSAGE_TYPE
//{
//    ENUM_MESSAGE_MSG,
//    ENUM_MESSAGE_LOG,
//    ENUM_MESSAGE_END
//};

///**
// * @brief The Message struct        消息结构体
// */
//struct Message
//{
//    int MessageLevel;               //消息级别
//    std::string time;               //产生时间
//    std::string componentName;      //组件实例名
//    std::string componentClassName; //组件类名
//    std::string messageType;        //消息类型
//    int messageCode;                //消息ID
//    int parameter1;                 //消息参数1
//    int parameter2;                 //消息参数2
//    std::string parameter3;         //消息参数3
//    std::string parameter4;         //消息参数4
//    std::string MessageInformation; //消息内容(提供用户可见)
//};


/**
 * @brief pthreadMutex ///线程互斥锁
 */
extern pthread_mutex_t pthreadMutex;

/**
 * @brief The XmlParse class xml读写类
 */
class XmlParse
{
public:
    XmlParse();
    ~XmlParse();

public:
    int readVersion(std::vector <ComponentVersion> &componentVersionList);
    /**
     * @brief openXml     打开ｘｍｌ文件
     * @param fileName     文件名称
     */
    bool openXml(QString fileName);
    /**
     * @brief closeXml
     */
    void closeXml();
    /**
     * @brief closeWriteXml　　　关闭写入的ｘｍｌ文件
     * @param fileName          文件名称
     */
    void closeWriteXml(QString fileName);
    /**
     * @brief closeReadXml      关闭读的ｘｍｌ文件
     */
    void closeReadXml();
    /**
     * @brief writeXml          写ｘｍｌ文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,int elementValue);
    /**
     * @brief writeXml          写ｘｍｌ文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName, double elementValue);
    /**
     * @brief writeXml          写ｘｍｌ文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName, long long elementValue);
    /**
     * @brief writeXml          写ｘｍｌ文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,QVariant elementValue);
    /**
     * @brief writeXml          写ｘｍｌ文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,QString elementValue);
    /**
     * @brief writeXml          写ｘｍｌ文件
     * @param elementName       节点名称
     * @param elementValue      节点属性
     * @return
     */
    bool writeXml(QString elementName,float elementValue);

    /**
     * @brief writeXml                      写ｍｄ５值到文件
     * @param robotId                      机器人ｉｄ，若ｉｄ为－１，则为全局变量，否则为机器人号码
     * @param elementName           文件名
     * @param elementValue            生成的文件的ＭＤ５值
     * @return
     */
    bool writeXml(int robotId,QString elementName,QString elementValue);


  //  QString readXml(QString elementName);

    /**
     * @brief readXml           读ｘｍｌ文件
     * @param elementName       节点名称
     * @param number            节点属性
     */
    int readXml(QString elementName,double &number);
    /**
     * @brief readXml           读ｘｍｌ文件
     * @param elementName       节点名称
     * @param number            节点属性
     */
    int readXml(QString elementName,int &number);
    /**
     * @brief readXml           读ｘｍｌ文件
     * @param elementName       节点名称
     * @param pwd               节点属性
     */
    int readXml(QString elementName,QString &pwd);
    /**
     * @brief readXml           读ｘｍｌ文件
     * @param elementName       节点名称
     * @param number            节点属性
     */
    int readXml(QString elementName,float &number);
    /**
     * @brief addPro            添加属性节点
     * @param proName           节点名称
     * @param proValue          节点属性
     * @return
     */
    bool addPro(QString proName,QString proValue); 
    /**
     * @brief addPro                            添加ｍｄ５属性节点
     * @param robotId                         添加ｉｄ
     * @param elementName
     * @param elementValue
     * @return
     */
    bool addPro(int robotId,QString elementName,QString elementValue);
    /**
     * @brief deletePro         删除节点
     * @param proName           节点名称
     * @return
     */
    bool deletePro(QString proName,int robotId);
    /**
     * @brief getAllProList     获取所有的属性节点
     * @param proNameMap        保存所有属性节点的对象
     */
    void getAllProList(QMap <int,QMap <QString,QString> > &proNameMap);
    /**
     * @brief readChXml          获取中文翻译列表
     * @param chMsgList         　存储获取列表结果
     */
    void readChXml(QVector<Message> &chMsgList);
//    void readChXml();
    /**
     * @brief readEnXml          获取英文翻译列表
     * @param enMsgList          存储获取列表结果
     */
    void readEnXml(QVector <Message> &enMsgList);
    /**
     * @brief writeXml          写ｘｍｌ文件属性
     * @param languageType      语言
     * @param index             添加的号码
     * @param level             级别
     * @param type              类型
     * @param info              数据信息
     */
    void writeXml(int languageType,int index,int level,QString type,QString info);

    /**
     * @brief findSubNode 查找节点的子节点
     * @param node
     * @param name
     * @return
     */
    QDomNode findSubNode(const QDomNode &node, QString name, bool &ok );

    /**
     * @brief addNode 往某节点添加一个子元素
     * @param pnode   某节点
     * @param nodeName  子元素
     * @param text   子元素de值
     * @return   子元素
     */
    QDomElement addNode(QDomNode &pnode, QString nodeName, QString val="");
    /**
     * @brief m_doc
     */
    QDomDocument m_doc;
    /**
     * @brief m_root  //主节点
     */
    QDomElement m_root;
    /**
     * @brief file
     */
    QFile *file;
    ComponentVersion versionInfo;



};

#endif // XMLPARSE_H




